package Tipos;

import java.util.LinkedList;
import java.util.List;

public class Buffer {
    /**
     * Variable publica: listaMensajes
     * almacenamiento de mensajes enviados desde y hacia
     * otras panaderias.
    */
    private List<Mensaje> listaMensajes;
    
    /**
     * Variable publica: disponible
     * indica si el buffer puede ser utilizado
     * para colocar o sacar mensajes.
    */
    private boolean disponible;

    public Buffer() {
        listaMensajes = new LinkedList<Mensaje>();
        disponible = true;
    }

    public synchronized Mensaje get(){
        while(!disponible){
            try{
                wait();
            }catch(InterruptedException ex){}
        }
        disponible=false;
        Mensaje mensaje;
        if (!listaMensajes.isEmpty()){
            mensaje = listaMensajes.get(0);
            listaMensajes.remove(0);
        }else{
            mensaje = null;
        }
        disponible = true;
        notifyAll();
        return mensaje;
    }
    
    public synchronized void put(Mensaje mensaje){
        while(!disponible){
            try{
                wait();
            }catch(InterruptedException ex){}
        }
        disponible = false;
        listaMensajes.add(mensaje);
        disponible=true;
        notifyAll();
    }
    
    public synchronized boolean isEmpty(){
        while(!disponible){
            try{
                wait();
            }catch(InterruptedException ex){}
        }
        disponible = false;
        boolean vacio;
        vacio = listaMensajes.isEmpty();
        disponible=true;
        notifyAll();
        return vacio;
    }

    public synchronized void vaciar() {
        while(!disponible){
            try{
                wait();
            }catch(InterruptedException ex){}
        }
        disponible = false;
        listaMensajes.clear();
        disponible=true;
        notifyAll();
    }

}
